#ifndef __COMM_MANAGER_H__
#define __COMM_MANAGER_H__


#include <iostream>
#include <vector>
#include <queue>
#include <string>
#include <chrono>
#include <thread>
#include <mutex>
#include <functional>
#include "uart.h"

/*管理的串口数量*/
#define USART_MAX_NUM  (1) 

/* 协议相关定义 */
#define PACKET_PREFIX 0x55
#define PREFIX_LEN 1
#define DEV_ID_LEN 1  // 新增：设备号字段长度（按需调整，如 1 字节）
#define CMD_LEN 1
#define DATA_LEN_FIELD_LEN 2
#define CRC_LEN 2

//typedef int (*doCmd)(std::vector<uint8_t> &data);
typedef std::function<int(std::vector<uint8_t>&)> doCmd;
typedef struct {
    int cmd;
    doCmd handler;
}CmdEntry;

/// @brief 用于统一管理UART发送的类
class commManager {
public:
    commManager();
    ~commManager();
    void begin_sr_thread(); // 启动发送线程接收线程和解析接收线程
    uint16_t crc16Calculate(const uint8_t* data, int len); // CRC16计算函数
    int sendPacket(int dev_id, int cmd, uint8_t* data, int dataLen);  // 将数据以规定的格式封装成数据包发送
    int recvPacket_thread(int dev_id); // 接收特定格式的包数据 并调用对应的处理函数
    int get(int dev_id, uint8_t &data); // 从接收队列中获取一位数据
    void push(int dev_id, void* buff, int len); // 将要发送的数据添加发送任务到发送队列中
    doCmd getCmd(int cmd);  // 查找指令并返回对应的句柄
    void insertCmd(int cmd, doCmd handler); // 插入指令
private:
    std::vector<CmdEntry> cmdTable; // 存储指令
    UART* Uart[USART_MAX_NUM];
    bool RUN_SIG;
    std::mutex mutex_s[USART_MAX_NUM];
    std::mutex mutex_r[USART_MAX_NUM];
    std::queue<std::string> sq[USART_MAX_NUM]; // 发送队列
    std::queue<char> rq[USART_MAX_NUM]; // 接收队列
    void send_thread(int dev_id); // 发送线程
    void recv_thread(int dev_id); // 接收线程
};

#endif // !__COMM_MANAGER_H__